package com.baizhi.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.HashMap;
import java.util.Map;

@Configuration
@Aspect
public class CacheAspect {

    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 添加缓存
     * 1.判断要得到的数据在缓存中有没有
     * 2.没有的话 查询数据  查询结果放到缓存中
     * 3.有的话 直接把缓存的结果 返回
     *
     * 环绕增强 需要放行操作  可以获取方法执行的返回值
     */

    @Around("@annotation(com.baizhi.annotation.InsertAnnotation)")
    public  Object selectAll(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //第一步首先获取类名
        String className=proceedingJoinPoint.getTarget().getClass().getName();
        System.out.println("当前类名是："+className);


        //第二步获取方法名和形参的值
        StringBuffer stringBuffer=new StringBuffer();
        String methodName = proceedingJoinPoint.getSignature().getName();
        stringBuffer.append(methodName);
        Object[] args = proceedingJoinPoint.getArgs();
        for (Object arg : args) {
            stringBuffer.append(arg);
        }

        String hashKey = stringBuffer.toString();
        System.out.println("hashkey是："+hashKey);

        //第三步判断需要的数据缓存中有没有
        HashOperations hashOperations =redisTemplate.opsForHash();

        Object result = hashOperations.get(className, hashKey);

        if(result==null){
            System.out.println("缓存中没有数据，正在执行数据库查询");
            //result为null的时候代表缓存中没有，就进行数据库查询操作，查询完毕，将查询结果
            //放到缓存中
            result=proceedingJoinPoint.proceed();

            Map map=new HashMap();
            //将key和值放到map中
            map.put(hashKey,result);

            hashOperations.putAll(className,map);
        }else{
            System.out.println("缓存中有数据，正在读取返回结果");
        }
        return result;
    }



    /**
     * 删除缓存
     *
     * 切注解
     */
    @Before("@annotation(com.baizhi.annotation.DeleteAnnotation)")
    public void deleteCache(JoinPoint joinPoint){
        //删除缓存
        System.out.println("删除缓存");

        //获取类名
        String className=joinPoint.getTarget().getClass().getName();

        System.out.println("要删除的类名："+className);

        //执行删除缓存操作
        redisTemplate.delete(className);

    }

}
